//class A {
//public:
//	A(string _name = "张三",int _age = 18)
//		:name(_name),
//		age(_age)
//	{}
//	string name;
//	int age;
//};
//class B : public A {
//public:
//	B()
//		:_age(20),
//		_name("李四")
//	{}
//	int _age;
//	string _name;
//};
//int main()
//{
//	A a;
//	B b;
//	return 0;
//}

//#include <stdio.h>
//#include <iostream>
//
//class B { public: int b; };
//class C1 : public B { public: int c1; };
//class C2 : public B { public: int c2; };
//class D : public C1, public C2 { public: int d; };
//
//int main() {
//      printf("sizeof(D) = %zu\n", sizeof(D));
//      //std::cout << "alignof(D) = " << alignof(D) << std::endl;
//      return 0;
//}

//class Car {
//public:
//	virtual void Drive()
//	{}
//};
//class Benz : public Car {
//public:
//	virtual void Drive() override
//	{
//		cout << "Benz-舒适" << endl;
//	}
//};
//int main()
//{
//	return 0;
//}

//class Car {
//public:
//	virtual void Drive() final
//	{}
//};
//class Benz : public Car {
//public:
//	virtual void Drive()
//	{
//		cout << "Benz-舒适" << endl;
//	}
//};
//int main()
//{
//	return 0;
//}

//class Car final {
//public:
//	virtual void Drive()
//	{}
//};
//class Benz : public Car {
//public:
//	virtual void Drive() override
//	{
//		cout << "Benz-舒适" << endl;
//	}
//};
//int main()
//{
//	return 0;
//}

////抽象类
//class Car
//{
//public:
//	virtual void Drive() = 0; //纯虚函数
//};
//class Benz : public Car
//{
//public:
//	virtual void Drive()
//	{
//		cout << "Benz-舒适" << endl;
//	}
//};
//class BWM : public Car
//{
//public:
//	virtual void Drive()
//	{
//		cout << "BWM-操控" << endl;
//	}
//};
//int main()
//{
//	//抽象类不能实例出对象
//	//Car car;
//
//	Car* pBenz = new Benz;
//	pBenz->Drive();
//
//	Car* pBWM = new BWM;
//	pBWM->Drive();
//
//	return 0;
//}

//class Base
//{
//public:
//	virtual void Func1()
//	{
//		cout << "Func1()" << endl;
//	}
//protected:
//	int _b = 1;
//	char _ch = 'x';
//};
//int main()
//{
//	Base b;
//	cout << sizeof(b) << endl;
//
//	return 0;
//}

class Person {
public:
	virtual void BuyTicket() { cout << "买票-全价" << endl; }
private:
	string _name;
};
class Student : public Person {
public:
	virtual void BuyTicket() { cout << "买票-打折" << endl; }
private:
	string _id;
};
class Soldier : public Person {
public:
	virtual void BuyTicket() { cout << "买票-优先" << endl; }
private:
	string _codename;
};
void Func(Person* ptr)
{
	// 这里可以看到虽然都是Person指针Ptr在调用BuyTicket
	// 但是跟ptr没关系，而是由ptr指向的对象决定的。
	ptr->BuyTicket();
}
int main()
{
	// 其次多态不仅仅发生在派生类对象之间，多个派生类继承基类，重写虚函数后
	// 多态也会发生在多个派生类之间。
	Person ps;
	Student st;
	Soldier sr;
	Func(&ps);
	Func(&st);
	Func(&sr);
	return 0;
}